package com.xnyzc.lhy.common.component.service;

import com.xnyzc.lhy.common.entity.RedisEnum;

import java.util.List;
import java.util.Map;

/**
 * @Description: 缓存操作接口
 * @Author: scootXin
 * @Date: 2019/4/12 11:11
 */
public interface ICacheService {

    /**
     * 检查数据
     *
     * @param redisEnum
     */
    boolean check(RedisEnum redisEnum);

    /**
     * 检查数据
     *
     * @param redisEnum
     */
    <PK> boolean check(RedisEnum redisEnum, PK pk);

    /**
     * 向简单类型新增或修改数据
     *
     * @param redisEnum
     * @param t
     * @param <T>
     */
    <T> void valAddOrUpdate(RedisEnum redisEnum, T t);

    /**
     * 获取简单类型数据
     *
     * @param redisEnum
     * @param <T>
     * @return
     */
    <T> T valGet(RedisEnum redisEnum, Class<T> tClass);

    /**
     * 获取简单类型数据列表
     *
     * @param redisEnum
     * @param <T>
     * @return
     */
    <T> List<T> valGetList(RedisEnum redisEnum, Class<T> tClass);

    /**
     * 设置简单类型过期时间
     *
     * @param seconds
     */
    void valExpire(RedisEnum redisEnum, int seconds);

    /**
     * 删除缓存
     *
     * @param redisEnum
     */
    void valDel(RedisEnum redisEnum);

    /**
     * 向hash中新增或修改数据
     *
     * @param redisEnum
     * @param t
     * @param <T>
     */
    <PK, T> void hashAddOrUpdate(RedisEnum redisEnum, PK pk, T t);

    /**
     * 向hash中新增或修改数据
     *
     * @param redisEnum
     * @param <T>
     */
    <PK, T> void hashAddOrUpdate(RedisEnum redisEnum, Map<PK, T> maps);

    /**
     * 独立删除hash中数据
     *
     * @param redisEnum
     * @param pks
     * @param <PK>
     */
    <PK> void hashDel(RedisEnum redisEnum, PK... pks);

    /**
     * 自动级联删除
     *
     * @param redisEnum
     * @param pks
     * @param <PK>
     */
    <PK> void hashCascadeAutoDel(RedisEnum redisEnum, PK... pks);

    /**
     * 指定级联删除
     *
     * @param pk
     * @param <PK>
     */
    <PK> void hashCascadePersonalDel(PK pk, RedisEnum... redisEnums);

    /**
     * 从hash中获取数据
     *
     * @param redisEnum
     * @param pk
     * @param <PK>
     * @param <T>
     * @return
     */
    <PK, T> T hashGet(RedisEnum redisEnum, Class<T> tClass, PK pk);

    /**
     * 从hash中获取数据
     *
     * @param redisEnum
     * @param pks
     * @param <PK>
     * @param <T>
     * @return
     */
    <PK, T> List<T> hashGet(RedisEnum redisEnum, Class<T> tClass, PK... pks);

    /**
     * 从hash中获取数据
     *
     * @param redisEnum
     * @param pk
     * @param <PK>
     * @param <T>
     * @return
     */
    <PK, T> List<T> hashGetList(RedisEnum redisEnum, Class<T> tClass, PK pk);

    /**
     * hash类型过期时间设置
     *
     * @param redisEnum
     * @param seconds
     */
    <PK> void hashExpire(RedisEnum redisEnum, PK pk, int seconds);

    /**
     * hash类型计数器新增
     *
     * @param redisEnum
     * @param pk
     */
    <PK> void hashIncrement(RedisEnum redisEnum, PK pk);

    /**
     * hash类型计数器新增
     *
     * @param redisEnum
     * @param pk
     */
    <PK> void hashIncrement(RedisEnum redisEnum, PK pk, int cnt);

//    /**
//     * 新增GEO标记点
//     *
//     * @param geoPoints
//     */
//    void geoAddOrUpdate(PangGeoPoint... geoPoints);
//
//    /**
//     * 删除GEO标记点
//     */
//    void geoRemove(PangGeoPoint... geoPoints);
//
//    /**
//     * 捡取符合条件坐标点
//     *
//     * @return
//     */
//    List<PangGeoPoint> geoRadius(RedisLocationTypeEnum locationType, String longitude, String latitude, double radius);

    /**
     * vehicle 新增list数据
     *
     * @param redisEnum
     * @param list
     * @param <T>
     */
    <T> void listRightPush(RedisEnum redisEnum, List<T> list);

    /**
     * vehicle 新增list数据
     *
     * @param <T>
     */
    <T> void listRightPush(String key, boolean isPersistence, T... input);

    /**
     * vehicle 获取list数据
     *
     * @param redisEnum
     * @param tClass
     * @param <T>
     */
    <T> T listLeftPop(RedisEnum redisEnum, Class<T> tClass);


    /**
     * vehicle 获取list数据
     *
     * @param tClass
     * @param <T>
     */
    <T> T listLeftPop(String key, boolean isPersistence, Class<T> tClass);
}
